package com.telit.firecommand.dao;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.telit.common.dto.LongitudeAndLatitudeDTO;
import com.telit.common.dto.PatrolAndCruiseCountDTO;
import com.telit.firecommand.dto.LonAndLatDTO;
import com.telit.firecommand.dto.SampleLibraryDto;
import com.telit.firecommand.dto.ViewSearchDTO;
import com.telit.firecommand.entity.CommCameraInfo;
import com.telit.firecommand.entity.CommFireAlarm;
import com.telit.firecommand.model.cityVisualization.QryFireTrend1YearModel;
import com.telit.firecommand.model.cityVisualization.QryFireTrend30DayModel;
import com.telit.firecommand.vo.ResourceSimpLevelMinVO;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.util.Date;
import java.util.List;
import java.util.Map;


@Repository
public interface CommFireAlarmDao extends BaseMapper<CommFireAlarm> {

    int deleteByPrimaryKey(Long id);

    int insert(CommFireAlarm record);

    int insertSelective(CommFireAlarm record);

    CommFireAlarm selectByPrimaryKey(Long id);

    List<CommFireAlarm> selectUnReadFire(List<Long> fireIds);

    CommFireAlarm selectByThirdId(String thirdId);

    int updateByPrimaryKeySelective(CommFireAlarm record);

    int updateByPrimaryKey(CommFireAlarm record);

    /**
     * 根据来源查询未处置完成的火情
     *
     * @param resource
     * @return
     */
    List<CommFireAlarm> querySameSourceUnCompleteDisposalFire(@Param("resource") List<String> resource);

    /**
     * 合并火情
     *
     * @param sourceFireId
     * @param repeatFireId
     */
    void setAsRepeatedFire(@Param("sourceFireId") Long sourceFireId, @Param("repeatFireId") Long repeatFireId);

    /**
     * 逻辑删除火情
     *
     * @param fireId
     */
    void deleteFire(@Param("fireId") Long fireId);

    /**
     * 更新火情初次判定等级
     *
     * @param fireId
     * @param fireLevel
     */
    void updatePrimaryLevel(@Param("fireId") Long fireId, @Param("fireLevel") String fireLevel);

    /**
     * 更新火情最终判定等级
     *
     * @param fireId
     * @param fireLevel
     */

    void updateFinalLevelAndEndTime(@Param("fireId") Long fireId, @Param("fireLevel") String fireLevel, @Param("endTime") Date endTime);

    /**
     * 修改火情状态
     *
     * @param fireId 火情id
     * @param status 状态
     */
    void updateStatus(@Param("fireId") Long fireId, @Param("status") String status, @Param("userId") Long userId, @Param("date") Date date, @Param("description") String description);

    /**
     * 更新上传文件
     * @param files
     */
    void updateFiles(@Param("files") String files,@Param("fireId") Long fireId);

    /**
     * 修改火情作用
     *
     * @param fireId 火情id
     * @param action 火情作用
     */
    void changeFireType(@Param("fireId") Long fireId, @Param("action") String action);

    /**
     * 查询火情是否存在
     *
     * @param fireId 火情id
     * @return 火情数量
     */
    int queryIsExist(@Param("fireId") Long fireId);

    /**
     * 查询火情当前状态
     *
     * @param fireId 火情id
     * @return
     */
    String queryCurrentStatus(@Param("fireId") Long fireId);


    /**
     * 设为应急演练
     *
     * @param fireId
     * @param action
     */
    void changeAction(@Param("fireId") Long fireId, @Param("action") String action);

    /**
     * 确认误报
     *
     * @param fireId
     * @param status
     * @param description
     */
    void comfirmFakeFire(@Param("fireId") Long fireId, @Param("status") String status, @Param("description") String description,@Param("faketype") String faketype, @Param("userId") Long userId, @Param("date") Date date);

    /**
     * 条件查询火情列表
     * TODO：fireType 该参数是宜昌项目对接外部，外部需要这样区分
     * 重要火情数：fire_level in (1,2,3,4)
     * 一般火情数：fire_level not in (1,2,3,4)
     * 非火情：status = 6
     * 重复告警数：origin_fire_id != 0
     */
    IPage<CommFireAlarm> queryAllFireByCondition(IPage<CommFireAlarm> appTaskStatusPage, @Param("status") String status,
                                                 @Param("startTime") String startTime, @Param("endTime") String endTime,
                                                 @Param("districtCode") String districtCode,
                                                 @Param("source") String source,
                                                 @Param("isEmergencyDrill") String isEmergencyDrill,
                                                 @Param("fireLevel") String fireLevel,
                                                 @Param("fireLevels") List<String> fireLevels,
                                                 @Param("fireName") String fireName,
                                                 @Param("fireTypeSql") String fireTypeSql);

    /**
     * 条件查询火情列表
     *
     * @param
     * @param status
     * @param startTime
     * @param endTime
     * @param districtCode
     * @param source
     * @param isEmergencyDrill
     * @return
     */
    List<CommFireAlarm> queryAllFireByConditionNoPage(@Param("status") String status, @Param("startTime") String startTime, @Param("endTime") String endTime, @Param("districtCode") String districtCode, @Param("source") String source, @Param("isEmergencyDrill") String isEmergencyDrill, @Param("fireLevel") String fireLevel);


    /**
     * 根据区域code查询地址
     *
     * @param districtCode
     * @return
     */
    String queryAddressNameByCode(@Param("districtCode") String districtCode);

    /**
     * 分页查询电话接警信息
     *
     * @param appTaskStatusPage
     * @return
     */
    IPage<CommFireAlarm> queryTelephoneAlarm(IPage<CommFireAlarm> appTaskStatusPage);

    /**
     * 分页查询电话接警信息
     *
     * @param appTaskStatusPage
     * @return
     */
    IPage<CommFireAlarm> queryTelephoneAlarmByDistrictCode(IPage<CommFireAlarm> appTaskStatusPage, @Param("districtCode") String districtCode);

    /**
     * 查询所有状态火情数量
     *
     * @return
     */
    List<Map<String, Object>> queryAllStatusNumber(@Param("districtCode") String districtCode);

    /**
     * 查询未处置完成火情数量
     *
     * @return
     */
  //  @Cacheable(value = "firecommand:firealarm:queryUnFinishFireNum",depict = "查询未处置完成火情数量")
    Integer queryUnFinishFireNum(@Param("districtCode") String districtCode);

    /**
     * 未处置完成火情超过10条
     *
     * @param page
     * @return
     */
  //  @Cacheable(value = "firecommand:firealarm:queryLeftFireInfoOrderByTimeAndStatus",depict = "未处置完成火情超过10条")
    IPage<CommFireAlarm> queryLeftFireInfoOrderByTimeAndStatus(IPage<CommFireAlarm> page, @Param("districtCode") String districtCode);

    /**
     * 按照时间和状态查询火情
     *
     * @return
     */
  //  @Cacheable(value = "firecommand:firealarm:queryLeftFireInfo",depict = "按照时间和状态查询火情")
    List<CommFireAlarm> queryLeftFireInfo(@Param("districtCode") String districtCode);

    /**
     * 查询未处置完成火情
     *
     * @param fireId
     * @param villageDistrictCode
     * @return
     */
    List<CommFireAlarm> queryNotFinishFire(@Param("fireId") Long fireId, @Param("districtCode") String villageDistrictCode);

    /**
     * 查询所有电话接警火情
     *
     * @param iPage
     * @param startTime
     * @param endTime
     * @return
     */
    IPage<CommFireAlarm> queryAllTelephoneAlarm(IPage<CommFireAlarm> iPage, @Param("startTime") String startTime, @Param("endTime") String endTime,@Param("districtCode") String districtCode);

    /**
     * 根据年份和来源统计火情数量
     *
     * @param year
     * @return
     */
    List<Map<String, Object>> queryCountByYearAndSource(@Param("year") String year);

    /**
     * 根据年份统计火情数量
     *
     * @param year
     *
     * @return
     */
    Integer queryCountByYear(@Param("year") String year, @Param("districtCode") String districtCode,
                             @Param("startTime") String startTime, @Param("endTime") String endTime,
                             @Param("fireLevel") String fireLevel, @Param("resource") String resource);

    /**
     * 火情等级统计
     */
    List<Map<String, Object>> queryCountByYearAndLevel(@Param("year") String year,
                                                       @Param("districtCode") String districtCode,
                                                       @Param("startTime") String startTime,
                                                       @Param("endTime") String endTime,
                                                       @Param("fireLevel") String fireLevel,
                                                       @Param("resource") String resource);

    /**
     * 火情来源统计
     */
    List<Map<String, Object>> queryCountByYearAndResource(@Param("year") String year,
                                                          @Param("districtCode") String districtCode,
                                                          @Param("startTime") String startTime,
                                                          @Param("endTime") String endTime,
                                                          @Param("fireLevel") String fireLevel,
                                                          @Param("resource") String resource);

    /**
     * 查询火情的多媒体
     *
     * @param fireId
     *
     * @return
     */
    CommFireAlarm queryMedia(@Param("fireId") Long fireId);

    /**
     * 根据地区统计火情数据
     *
     * @param year
     *
     * @return
     */
    List<Map<String, Object>> queryDistrictFireCount(@Param("year") String year,
                                                     @Param("districtCode") String districtCode,
                                                     @Param("startTime") String startTime,
                                                     @Param("endTime") String endTime,
                                                     @Param("fireLevel") String fireLevel,
                                                     @Param("resource") String resource,
                                                     @Param("status") String status);

    /**
     * 查询所有未处置完成火情
     *
     * @return
     */
    List<CommFireAlarm> queryNotSameSourceUnCompleteDisposalFire(@Param("resource") List<String> resource);

    /**
     * 根据任务id查询火情数据
     *
     * @param taskId
     * @return
     */
    CommFireAlarm selectByTaskId(@Param("taskId") Long taskId, @Param("eventType") String eventType,
                                 @Param("foresterId") Long foresterId);

    /**
     * 查询所有火情状态
     *
     * @return
     */
    List<Map<Object, Object>> queryAllStatus();

    /**
     * 查询所有火情来源
     *
     * @return
     */
    List<Map<Object, Object>> queryAllSource();

    /**
     * 分页查询历史火情
     *
     * @param appTaskStatusPage
     * @param startTime
     * @param endTime
     * @param districtCode
     * @param fireLevel
     *
     * @return
     */
    IPage<CommFireAlarm> queryAllHistoryFire(IPage<CommFireAlarm> appTaskStatusPage,
                                             @Param("startTime") String startTime, @Param("endTime") String endTime,
                                             @Param("districtCode") String districtCode,
                                             @Param("fireLevel") String fireLevel, @Param("resource") String resource);

    /**
     * 查询历史火情
     *
     * @param startTime
     * @param endTime
     * @param districtCode
     * @param fireLevel
     *
     * @return
     */
    List<CommFireAlarm> queryAllHistoryFireNoPage(@Param("startTime") String startTime,
                                                  @Param("endTime") String endTime,
                                                  @Param("districtCode") String districtCode,
                                                  @Param("fireLevel") String fireLevel,
                                                  @Param("resource") String resource);

    /**
     * 更新接警人信息
     *
     * @param fireId
     * @param userId
     * @param date
     */
    void updateReceiveInfo(@Param("status") String status, @Param("fireId") Long fireId, @Param("userId") Long userId, @Param("date") Date date);

    /**
     * 更新处置人信息
     *
     * @param fireId
     * @param userId
     * @param date
     */
    void updateManagementInfo(@Param("status") String status, @Param("fireId") Long fireId, @Param("userId") Long userId, @Param("date") Date date);

    /**
     * 更新完成处置人信息
     *
     * @param fireId
     * @param userId
     * @param date
     */
    void updateFinishInfo(@Param("status") String status, @Param("fireId") Long fireId, @Param("userId") Long userId, @Param("date") Date date);

    /**
     * 根据火情id查询火灾终判级别
     *
     * @param fireId
     * @return
     */
    String queryFinalLevel(@Param("fireId") Long fireId);

    /**
     * 查询应急演练火情
     *
     * @param appTaskStatusPage
     * @param startTime
     * @param endTime
     * @param districtCode
     * @return
     */
    IPage<CommFireAlarm> queryAllHistoryEmergencyFire(IPage<CommFireAlarm> appTaskStatusPage, @Param("startTime") String startTime, @Param("endTime") String endTime, @Param("districtCode") String districtCode);

    /**
     * app端条件查询
     *
     * @param iPage
     * @param userId
     * @param startTime
     * @param endTime
     * @return
     */
    IPage<CommFireAlarm> appQueryAllFireByCondition(IPage<CommFireAlarm> iPage, @Param("userId") Long userId, @Param("startTime") String startTime, @Param("endTime") String endTime);

    /**
     * 通过年份查询历史应急演练火情数量
     *
     * @param year
     * @return
     */
    Integer queryCountHistoryEmergencyFireByYear(@Param("year") String year);

    /**
     * 通过年份区域统计历史应急演练火情数量
     *
     * @param year
     * @return
     */
    List<Map<String, Object>> queryDistrictHistoryEmergencyFireCount(@Param("year") String year);

    /**
     * 不分页条件查询实例应急演练数据
     *
     * @param startTime
     * @param endTime
     * @param districtCode
     * @return
     */
    List<CommFireAlarm> queryAllHistoryEmergencyFireNoPage(@Param("startTime") String startTime, @Param("endTime") String endTime, @Param("districtCode") String districtCode);

    /**
     * 查询火情所在经纬度
     *
     * @param fireId
     * @return
     */
    LongitudeAndLatitudeDTO queryLongitudeAndLatitude(@Param("fireId") Long fireId);

    /**
     * 查询火情是否已判别
     *
     * @param fireId
     * @return
     */
    Long hasJudgment(@Param("fireId") Long fireId);

    /**
     * 监控发现火情判别
     *
     * @param fireId
     * @param fireJudgmentType
     */
    void updateJudgmentType(@Param("fireId") Long fireId, @Param("fireJudgmentType") Integer fireJudgmentType);

    /**
     * 查询所有监控发现火情
     *
     * @param hasJudgment
     * @return
     */
    List<CommFireAlarm> queryCameraFindFireNoPage(@Param("hasJudgment") Integer hasJudgment, @Param("startTime") String startTime, @Param("endTime") String endTime, @Param("districtCode") String districtCode);

    /**
     * 分页查询
     *
     * @param iPage
     * @param hasJudgment
     * @return
     */
    IPage<CommFireAlarm> queryCameraFindFire(IPage<CommFireAlarm> iPage, @Param("hasJudgment") Integer hasJudgment, @Param("startTime") String startTime, @Param("endTime") String endTime, @Param("districtCode") String districtCode);

    /**
     * 查询火情报警总数量
     *
     * @param startTime
     * @param endTime
     * @return
     */
    Long queryFireCountByFlag(@Param("startTime") Date startTime, @Param("endTime") Date endTime);

    /**
     * 根据不同来源统计火情报警
     *
     * @param startTime
     * @param endTime
     * @return
     */
    List<Map<String, Object>> queryFireCountByFlagAndSource(@Param("startTime") Date startTime, @Param("endTime") Date endTime);

    /**
     * 查询真实火情统计
     *
     * @param startTime
     * @param endTime
     * @return
     */
    Long queryRealFireCount(@Param("startTime") Date startTime, @Param("endTime") Date endTime);

    /**
     * 查询虚假火情统计
     *
     * @param startTime
     * @param endTime
     * @return
     */
    Long queryFakeFireCount(@Param("startTime") Date startTime, @Param("endTime") Date endTime);

    /**
     * 查询监控当日发现火情统计
     *
     * @return
     */
    Long queryCountAllCameraFindFire(@Param("startTime") Date startTime, @Param("endTime") Date endTime);

    /**
     * 查询真实火情
     *
     * @param startTime
     * @param endTime
     * @return
     */
    Long queryCountRealCameraFindFire(@Param("startTime") Date startTime, @Param("endTime") Date endTime);

    /**
     * 查询疑似火情
     *
     * @param startTime
     * @param endTime
     * @return
     */
    Long queryCountSuspectCameraFindFire(@Param("startTime") Date startTime, @Param("endTime") Date endTime);

    /**
     * 查询虚假火情
     *
     * @param startTime
     * @param endTime
     * @return
     */
    Long queryCountFakeCameraFindFire(@Param("startTime") Date startTime, @Param("endTime") Date endTime);

    /**
     * 查询所有火情发生区划
     *
     * @param startTime
     * @param endTime
     * @return
     */
    List<String> queryAllFireDistrictByTime(@Param("startTime") Date startTime, @Param("endTime") Date endTime);

    /**
     * 查询所有火情发生区划通过街道行政区划
     *
     * @param startTime
     * @param endTime
     * @param districtCode
     * @return
     */
    List<String> queryAllFireDistrictByTimeAndDistrict(@Param("startTime") Date startTime, @Param("endTime") Date endTime,@Param("districtCode") String districtCode);

    /**
     * 根据行政区划统计所有火情数据
     *
     * @param district
     * @return
     */
    Long queryCountByDistrict(@Param("district") String district, @Param("startTime") Date startTime, @Param("endTime") Date endTime);

    /**
     * 根据来源计算火情上报次数
     *
     * @return
     */
    List<PatrolAndCruiseCountDTO> selectFireCountBySource();

//    @Cacheable(value = "firecommand:firealarm:selectFireCountBySourceByDistrictCode",depict = "根据行政区划查询数量和来源")
    List<PatrolAndCruiseCountDTO> selectFireCountBySourceByDistrictCode(@Param("districtCode") String districtCode);


    /**
     * 条件查询火情明细
     *
     * @param startTime
     * @param endTime
     * @param districtCode
     * @param fireLevel
     * @return
     */
    List<CommFireAlarm> queryFireDetailByCondition(@Param("startTime") Date startTime, @Param("endTime") Date endTime, @Param("districtCode") String districtCode, @Param("fireLevel") String fireLevel);

    /**
     * 通过火情id查询监控信息
     *
     * @param fireId
     * @return
     */
    List<CommCameraInfo> queryCameraByFireId(@Param("fireId") Long fireId);

    /**
     * 条件查询历史火情明细
     *
     * @param startTime
     * @param endTime
     * @param districtCode
     * @param fireLevel
     * @return
     */
    List<CommFireAlarm> queryHistoryFireDetailByCondition(@Param("startTime") Date startTime, @Param("endTime") Date endTime, @Param("districtCode") String districtCode, @Param("fireLevel") String fireLevel);

    /**
     * 统计今日火情报警数量
     *
     * @param startTime
     * @param endTime
     * @return
     */
    Long queryTodayFireCount(@Param("startTime") Date startTime, @Param("endTime") Date endTime, @Param("districtCode") String districtCode);

    /**
     * 查询所有状态的火情数量
     *
     * @return
     */
    List<Map<String, Object>> queryAllFireStatusCount(@Param("districtCode") String districtCode);

    /**
     * 查询监控发现相似火情
     *
     * @param cameraId
     * @param currentDayZeroTime
     * @param date
     * @return
     */
    List<CommFireAlarm> queryCameraFindSameFire(@Param("cameraId") Long cameraId, @Param("startTime") Date currentDayZeroTime, @Param("endTime") Date date);

    /**
     * app端查询火情
     *
     * @param appTaskStatusPage
     * @param status
     * @param startTime
     * @param endTime
     * @param districtCode
     * @param source
     * @param isEmergencyDrill
     * @param fireLevel
     * @return
     */
    IPage<CommFireAlarm> queryAllFireForAppByCondition(IPage<CommFireAlarm> appTaskStatusPage, @Param("status") String status, @Param("startTime") String startTime, @Param("endTime") String endTime, @Param("districtCode") String districtCode, @Param("source") String source, @Param("isEmergencyDrill") String isEmergencyDrill, @Param("fireLevel") String fireLevel);

    List<CommFireAlarm> queryNotFinishFireByPoint(String firePoint);

    IPage<SampleLibraryDto> queryAllSampleLibrary(IPage<SampleLibraryDto> iPage, @Param("startTime") String startTime,
                                                  @Param("endTime") String endTime,
                                                  @Param("districtCode") String districtCode,
                                                  @Param("judgement") Integer judgement);

    List<Long> queryAllFireAlarmByOrginId(Long fireId);

    List<LonAndLatDTO> queryUnfinishedFireByDay(@Param("day") String day, @Param("districtCode") String districtCode);

    List<Map<String, Object>> queryFireCountByDistrictCode(@Param("year") String year,
                                                           @Param("districtCode") String districtCode,
                                                           @Param("startTime") String startTime,
                                                           @Param("endTime") String endTime,
                                                           @Param("fireLevel") String fireLevel,
                                                           @Param("resource") String resource,
                                                           @Param("status") String status);

    List<Map<String, Object>> queryFireCountByDistrictCode1(@Param("year") String year,
                                                            @Param("districtCode") String districtCode,
                                                            @Param("startTime") String startTime,
                                                            @Param("endTime") String endTime,
                                                            @Param("fireLevel") String fireLevel,
                                                            @Param("resource") String resource,
                                                            @Param("status") String status);

    List<Map<String, Object>> queryFireCountByDistrictCode2(@Param("year") String year,
                                                            @Param("districtCode") String districtCode,
                                                            @Param("startTime") String startTime,
                                                            @Param("endTime") String endTime,
                                                            @Param("fireLevel") String fireLevel,
                                                            @Param("resource") String resource,
                                                            @Param("status") String status);

    List<Map<String, String>> queryAddressNamesByCodeList(@Param("districtCodeList") List<String> districtCodeList);

    List<CommFireAlarm> queryListByFireIds(@Param("fireIdList") List<Long> fireIdList);

    String queryDistrictCodeById(Long fireId);


    List<Map> queryFireCountVO(@Param("districtCode") String districtCode);


    List<Map> fireSimpListByViewSearch(@Param("rank") Integer rank,
                                       @Param("ViewSearchDTO") ViewSearchDTO viewSearchDTO);

    List<Map> fireResourceSimpListByViewSearch(@Param("rank") Integer rank, @Param("tableName") String tableName,
                                               @Param("ViewSearchDTO") ViewSearchDTO viewSearchDTO);

    List<Map> fireCameraSimpListByViewSearch(@Param("rank") Integer rank, @Param("tableName") String tableName,
                                             @Param("ViewSearchDTO") ViewSearchDTO viewSearchDTO,
                                             @Param("type") String type);

    List<ResourceSimpLevelMinVO> fireListBySearchLevelMin(@Param("ViewSearchDTO") ViewSearchDTO viewSearchDTO);

    List<QryFireTrend30DayModel> qryFireTrend30Day(@Param("districtCode") String districtCode,
                                                   @Param("startTime") String startTime,
                                                   @Param("endTime") String endTime);

    List<QryFireTrend1YearModel> qryFireTrend1Year(@Param("districtCode") String districtCode,
                                                   @Param("startTime") String startTime,
                                                   @Param("endTime") String endTime);

    int insertPrimal(CommFireAlarm commFireAlarm);

    int queryCount(@Param("districtCode") String districtCode, @Param("status") String status);

}